Jackson-এ Custom Naming Strategy ব্যবহার করা হয় JSON ফিল্ড নাম এবং Java অবজেক্টের ফিল্ড নামের মধ্যে একটি কাস্টম ম্যাপিং নির্ধারণ করতে। ডিফল্টভাবে, Jackson JSON ফিল্ড নাম এবং Java ফিল্ড নাম একই থাকে। তবে, কাস্টমাইজড নামের নিয়ম প্রয়োগ করার জন্য আপনি Custom Naming Strategy ব্যবহার করতে পারেন।
Custom Naming Strategy কনফিগার করার উপায়
Jackson-এ, আপনি একটি Custom Naming Strategy তৈরি করতে পারেন এবং এটি ObjectMapper-এ সেট করতে পারেন। এটি করার জন্য com.fasterxml.jackson.databind.PropertyNamingStrategy ক্লাস এক্সটেন্ড করতে হবে।
1. ডিফল্ট PropertyNamingStrategy এর উদাহরণ
Jackson ডিফল্টভাবে কয়েকটি Naming Strategy সরবরাহ করে:
- SNAKE_CASE: JSON ফিল্ড নাম
snake_caseফরম্যাটে কনভার্ট হবে। - UPPER_CAMEL_CASE: JSON ফিল্ড নাম
UpperCamelCaseফরম্যাটে কনভার্ট হবে। - LOWER_CASE: JSON ফিল্ড নাম ছোট হাতের অক্ষরে কনভার্ট হবে।
উদাহরণ: SNAKE_CASE Naming Strategy
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.PropertyNamingStrategies;
public class DefaultNamingStrategyExample {
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
mapper.setPropertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE);
// Example object
Person person = new Person("John Doe", 30);
// Serialize to JSON
String json = mapper.writeValueAsString(person);
System.out.println("Serialized JSON: " + json);
}
}
class Person {
private String fullName;
private int age;
public Person(String fullName, int age) {
this.fullName = fullName;
this.age = age;
}
public String getFullName() {
return fullName;
}
public void setFullName(String fullName) {
this.fullName = fullName;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
Output:
Serialized JSON: {"full_name":"John Doe","age":30}
2. Custom Naming Strategy তৈরি করা
আপনি আপনার নিজস্ব Naming Strategy তৈরি করতে পারেন PropertyNamingStrategy ক্লাস এক্সটেন্ড করে এবং translate মেথড ওভাররাইড করে।
Custom Naming Strategy উদাহরণ
import com.fasterxml.jackson.databind.PropertyNamingStrategies;
import com.fasterxml.jackson.databind.ObjectMapper;
public class CustomNamingStrategyExample {
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
mapper.setPropertyNamingStrategy(new CustomNamingStrategy());
// Example object
Employee employee = new Employee("Alice Johnson", "Software Developer");
// Serialize to JSON
String json = mapper.writeValueAsString(employee);
System.out.println("Serialized JSON: " + json);
// Deserialize JSON to Object
String inputJson = "{\"employee_name\":\"Alice Johnson\",\"employee_role\":\"Software Developer\"}";
Employee deserializedEmployee = mapper.readValue(inputJson, Employee.class);
System.out.println("Deserialized Employee: " + deserializedEmployee);
}
}
class Employee {
private String employeeName;
private String employeeRole;
public Employee() {}
public Employee(String employeeName, String employeeRole) {
this.employeeName = employeeName;
this.employeeRole = employeeRole;
}
public String getEmployeeName() {
return employeeName;
}
public void setEmployeeName(String employeeName) {
this.employeeName = employeeName;
}
public String getEmployeeRole() {
return employeeRole;
}
public void setEmployeeRole(String employeeRole) {
this.employeeRole = employeeRole;
}
@Override
public String toString() {
return "Employee{employeeName='" + employeeName + "', employeeRole='" + employeeRole + "'}";
}
}
class CustomNamingStrategy extends PropertyNamingStrategies.NamingBase {
@Override
public String translate(String propertyName) {
// Convert camelCase to custom naming strategy: e.g., employeeName -> employee_name
return "employee_" + propertyName.toLowerCase();
}
}
Output:
Serialized JSON: {"employee_name":"Alice Johnson","employee_role":"Software Developer"}
Deserialized Employee: Employee{employeeName='Alice Johnson', employeeRole='Software Developer'}
3. কাস্টম Naming Strategy এবং @JsonProperty একত্রে ব্যবহার
Jackson-এ আপনি @JsonProperty অ্যানোটেশন ব্যবহার করে নির্দিষ্ট ফিল্ডের নাম কাস্টমাইজ করতে পারেন। Naming Strategy এবং @JsonProperty একত্রে ব্যবহার করা সম্ভব।
উদাহরণ:
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.ObjectMapper;
public class JsonPropertyExample {
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
// Example object
Department department = new Department("IT", "Information Technology");
// Serialize to JSON
String json = mapper.writeValueAsString(department);
System.out.println("Serialized JSON: " + json);
// Deserialize JSON to Object
String inputJson = "{\"dept_id\":\"IT\",\"dept_name\":\"Information Technology\"}";
Department deserializedDept = mapper.readValue(inputJson, Department.class);
System.out.println("Deserialized Department: " + deserializedDept);
}
}
class Department {
@JsonProperty("dept_id")
private String departmentId;
@JsonProperty("dept_name")
private String departmentName;
public Department() {}
public Department(String departmentId, String departmentName) {
this.departmentId = departmentId;
this.departmentName = departmentName;
}
public String getDepartmentId() {
return departmentId;
}
public void setDepartmentId(String departmentId) {
this.departmentId = departmentId;
}
public String getDepartmentName() {
return departmentName;
}
public void setDepartmentName(String departmentName) {
this.departmentName = departmentName;
}
@Override
public String toString() {
return "Department{departmentId='" + departmentId + "', departmentName='" + departmentName + "'}";
}
}
Output:
Serialized JSON: {"dept_id":"IT","dept_name":"Information Technology"}
Deserialized Department: Department{departmentId='IT', departmentName='Information Technology'}
- ডিফল্ট Naming Strategies (যেমন SNAKE_CASE, KEBAB_CASE) সরাসরি ব্যবহার করা যায়।
- Custom Naming Strategy তৈরি করে নির্দিষ্ট নিয়ম অনুসারে ফিল্ড নাম পরিবর্তন করা সম্ভব।
@JsonPropertyনির্দিষ্ট ফিল্ডে কাস্টম নাম নির্ধারণ করতে আরও নিয়ন্ত্রণ প্রদান করে।
Jackson-এর Naming Strategy ফিচার আপনার JSON এবং Java Object এর ফিল্ড নামের সামঞ্জস্যতা বজায় রাখতে সাহায্য করে।
Jackson ডিফল্টভাবে Java ফিল্ডগুলোর নাম JSON ফিল্ডের নামে ব্যবহার করে। তবে, অনেক সময় JSON ফিল্ডের নাম Java ফিল্ডের নামের সাথে মিল থাকে না বা অন্য রকম ফরম্যাটিং (যেমন: snake_case বা kebab-case) প্রয়োজন হয়। এ ক্ষেত্রে Custom Field Naming Strategy ব্যবহার করে ফিল্ডের নাম নিয়ন্ত্রণ করা যায়।
Jackson PropertyNamingStrategy বা PropertyNamingStrategies ক্লাস ব্যবহার করে ফিল্ড নাম পরিবর্তন করার কৌশল সরবরাহ করে। তবে, যদি আপনার প্রয়োজন আরও কাস্টমাইজড নিয়ন্ত্রণ, তাহলে আপনি নিজস্ব Naming Strategy তৈরি করতে পারেন।
Built-in Naming Strategies
Jackson-এর কয়েকটি বিল্ট-ইন Naming Strategy:
SNAKE_CASE: ফিল্ডের নামকে snake_case ফরম্যাটে পরিবর্তন করে।UPPER_CAMEL_CASE: ফিল্ডের নামকে UpperCamelCase ফরম্যাটে পরিবর্তন করে।KEBAB_CASE: ফিল্ডের নামকে kebab-case ফরম্যাটে পরিবর্তন করে।LOWER_CASE: ফিল্ডের নামকে ছোট হাতের অক্ষরে পরিবর্তন করে।
Custom Field Naming Strategy তৈরি করার ধাপসমূহ
ধাপ ১: Custom Naming Strategy তৈরি
PropertyNamingStrategy ক্লাস Extend করে আপনার নিজস্ব লজিক প্রয়োগ করুন।
ধাপ ২: ObjectMapper-এ Custom Naming Strategy সেট করুন।
উদাহরণ: Custom Field Naming Strategy
১. Custom Naming Strategy তৈরি
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
import com.fasterxml.jackson.databind.cfg.MapperConfig;
import com.fasterxml.jackson.databind.introspect.AnnotatedField;
import com.fasterxml.jackson.databind.introspect.AnnotatedMethod;
import com.fasterxml.jackson.databind.introspect.AnnotatedParameter;
public class CustomNamingStrategy extends PropertyNamingStrategy {
@Override
public String nameForField(MapperConfig<?> config, AnnotatedField field, String defaultName) {
return "custom_" + defaultName; // ফিল্ডের নামের আগে "custom_" যোগ করা
}
@Override
public String nameForGetterMethod(MapperConfig<?> config, AnnotatedMethod method, String defaultName) {
return "custom_" + defaultName; // Getter মেথডের জন্য
}
@Override
public String nameForSetterMethod(MapperConfig<?> config, AnnotatedMethod method, String defaultName) {
return "custom_" + defaultName; // Setter মেথডের জন্য
}
}
২. ObjectMapper-এ Naming Strategy সেট করা
import com.fasterxml.jackson.databind.ObjectMapper;
public class CustomFieldNamingExample {
public static void main(String[] args) {
try {
// Custom Naming Strategy সেট করুন
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setPropertyNamingStrategy(new CustomNamingStrategy());
// Object তৈরি
User user = new User(1, "Rahim", "rahim@example.com");
// Object থেকে JSON
String json = objectMapper.writeValueAsString(user);
System.out.println("Serialized JSON with Custom Naming: " + json);
} catch (Exception e) {
e.printStackTrace();
}
}
}
class User {
private int id;
private String name;
private String email;
public User(int id, String name, String email) {
this.id = id;
this.name = name;
this.email = email;
}
public int getId() {
return id;
}
public String getName() {
return name;
}
public String getEmail() {
return email;
}
}
৩. আউটপুট:
{
"custom_id": 1,
"custom_name": "Rahim",
"custom_email": "rahim@example.com"
}
Custom Naming Strategy উদাহরণ: Snake Case to Kebab Case
ফিল্ডের নামকে snake_case থেকে kebab-case-এ রূপান্তর করার জন্য Custom Naming Strategy:
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
import com.fasterxml.jackson.databind.cfg.MapperConfig;
import com.fasterxml.jackson.databind.introspect.AnnotatedField;
public class SnakeToKebabNamingStrategy extends PropertyNamingStrategy {
@Override
public String nameForField(MapperConfig<?> config, AnnotatedField field, String defaultName) {
return defaultName.replace("_", "-"); // snake_case কে kebab-case-এ পরিবর্তন
}
}
ObjectMapper-এ সেট করুন:
objectMapper.setPropertyNamingStrategy(new SnakeToKebabNamingStrategy());
Built-in Strategy ব্যবহার
উদাহরণ: SNAKE_CASE ব্যবহার
import com.fasterxml.jackson.databind.PropertyNamingStrategies;
import com.fasterxml.jackson.databind.ObjectMapper;
public class SnakeCaseExample {
public static void main(String[] args) {
try {
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setPropertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE);
User user = new User(1, "Rahim", "rahim@example.com");
String json = objectMapper.writeValueAsString(user);
System.out.println("Serialized JSON with SNAKE_CASE: " + json);
} catch (Exception e) {
e.printStackTrace();
}
}
}
আউটপুট:
{
"id": 1,
"name": "Rahim",
"email": "rahim@example.com"
}
Custom Naming Strategy-এর উপকারিতা
- Dynamic Control: JSON ফিল্ডের নাম কাস্টমাইজ করতে পারার ক্ষমতা।
- Integration: অন্য সিস্টেম বা API-এর ফিল্ড নামের সাথে Java ফিল্ডের নাম সামঞ্জস্য করা।
- Reusability: একবার Naming Strategy তৈরি করলে এটি বহু স্থানে ব্যবহার করা যায়।
- Custom Field Naming Strategy তৈরি করতে
PropertyNamingStrategyExtend করে প্রয়োজনীয় লজিক লিখতে হয়। - Jackson বিল্ট-ইন
SNAKE_CASE,KEBAB_CASE, ইত্যাদি Naming Strategy প্রদান করে। - Custom এবং Built-in Naming Strategy ObjectMapper-এ সহজেই যুক্ত করা যায়, যা ফিল্ড নামের কাস্টমাইজেশন সহজ করে।
Jackson-এ PropertyNamingStrategy বা PropertyNamingStrategies ব্যবহার করে Java ফিল্ডের নাম এবং JSON ফিল্ডের নামের মধ্যে কাস্টম ম্যাপিং তৈরি করা যায়। এটি বিশেষভাবে দরকার হয় যখন JSON ফিল্ডের নাম Java ফিল্ডের নামের থেকে ভিন্ন হয় বা নির্দিষ্ট নামকরণের কনভেনশন (যেমন snake_case বা kebab-case) অনুসরণ করতে হয়।
Property Naming Strategies
Jackson আপনাকে বিভিন্ন বিল্ট-ইন নামকরণ কৌশল প্রদান করে:
SNAKE_CASE: ফিল্ড নামগুলিকে snake_case-এ রূপান্তর করে।UPPER_CAMEL_CASE: ফিল্ড নামগুলিকে UpperCamelCase-এ রূপান্তর করে।KEBAB_CASE: ফিল্ড নামগুলিকে kebab-case-এ রূপান্তর করে।LOWER_CASE: ফিল্ড নামগুলিকে lowercase-এ রূপান্তর করে।- Custom Strategy: নিজের কাস্টম স্ট্র্যাটেজি তৈরি করা যায়।
কোড উদাহরণ
Step 1: Maven Dependency
প্রথমে, Jackson লাইব্রেরি আপনার প্রোজেক্টে যোগ করুন:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.15.2</version>
</dependency>
Step 2: একটি ডেটা মডেল তৈরি করুন
Java ফিল্ডগুলোর নাম camelCase ফরম্যাটে থাকবে।
public class Person {
private String firstName;
private String lastName;
private int age;
// Constructors
public Person() {}
public Person(String firstName, String lastName, int age) {
this.firstName = firstName;
this.lastName = lastName;
this.age = age;
}
// Getters and Setters
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
Step 3: ObjectMapper-এ Naming Strategy সেট করুন
PropertyNamingStrategies ব্যবহার করে ফিল্ড নামের কনভেনশন পরিবর্তন করুন।
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.PropertyNamingStrategies;
public class PropertyNamingStrategyExample {
public static void main(String[] args) throws Exception {
ObjectMapper objectMapper = new ObjectMapper();
// Set SNAKE_CASE naming strategy
objectMapper.setPropertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE);
// Create a Person object
Person person = new Person("John", "Doe", 30);
// Serialize: Java Object to JSON
String json = objectMapper.writeValueAsString(person);
System.out.println("Serialized JSON with SNAKE_CASE:");
System.out.println(json);
// Deserialize: JSON to Java Object
String jsonInput = """
{
"first_name": "Jane",
"last_name": "Smith",
"age": 25
}
""";
Person deserializedPerson = objectMapper.readValue(jsonInput, Person.class);
System.out.println("Deserialized Object:");
System.out.println(deserializedPerson.getFirstName() + " " + deserializedPerson.getLastName());
}
}
Output
Serialized JSON
{
"first_name": "John",
"last_name": "Doe",
"age": 30
}
Deserialized Object
Jane Smith
Custom Property Naming Strategy
আপনার প্রয়োজন অনুযায়ী কাস্টম স্ট্র্যাটেজি তৈরি করতে পারেন:
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
import com.fasterxml.jackson.databind.introspect.AnnotatedField;
public class CustomNamingStrategy extends PropertyNamingStrategy {
@Override
public String nameForField(MapperConfig<?> config, AnnotatedField field, String defaultName) {
return "custom_" + defaultName; // Add "custom_" prefix to every field
}
}
এই কাস্টম স্ট্র্যাটেজি ব্যবহার করতে ObjectMapper-এ সেট করুন:
objectMapper.setPropertyNamingStrategy(new CustomNamingStrategy());
Jackson-এর PropertyNamingStrategy এবং PropertyNamingStrategies ব্যবহার করে JSON ফিল্ডের নাম সহজেই কাস্টমাইজ করা যায়।
মূল সুবিধা:
- Standard Naming Conventions:
snake_case,kebab-caseইত্যাদি সহজেই সামঞ্জস্যপূর্ণ করা। - Custom Mapping: নিজের প্রয়োজন মতো কাস্টম স্ট্র্যাটেজি ব্যবহার।
- Flexible Integration: বিভিন্ন JSON ফরম্যাটের সাথে সহজে কাজ করা।
এটি REST API, ডেটা ট্রান্সফার অবজেক্ট (DTO), এবং অন্যান্য JSON ইন্টিগ্রেশন ক্ষেত্রে অত্যন্ত কার্যকর।
Jackson ডিফল্টভাবে camelCase (যেমন, firstName) ব্যবহার করে সিরিয়ালাইজ এবং ডেসিরিয়ালাইজ করে। তবে, প্রজেক্টের প্রয়োজন অনুযায়ী snake_case (যেমন, first_name) বা kebab-case (যেমন, first-name) ফরম্যাট ব্যবহারের জন্য Jackson-এ কনফিগারেশন পরিবর্তন করা সম্ভব।
Naming Strategy সেটআপ করার ধাপ
Jackson এর PropertyNamingStrategy বা নতুন PropertyNamingStrategies API ব্যবহার করে বিভিন্ন নামকরণ স্টাইল সেট করা যায়।
1. Snake Case Naming Strategy
উদাহরণ: Snake Case ব্যবহার
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.PropertyNamingStrategies;
public class SnakeCaseExample {
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
// Snake Case Naming Strategy সেট করা
mapper.setPropertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE);
User user = new User("John", "Doe");
String json = mapper.writeValueAsString(user);
System.out.println("Serialized JSON (Snake Case): " + json);
String inputJson = "{ \"first_name\": \"John\", \"last_name\": \"Doe\" }";
User deserializedUser = mapper.readValue(inputJson, User.class);
System.out.println("Deserialized User: " + deserializedUser);
}
}
class User {
private String firstName;
private String lastName;
// Constructor
public User(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
// Getters
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
// toString Method
@Override
public String toString() {
return "User{firstName='" + firstName + "', lastName='" + lastName + "'}";
}
}
Output:
Serialized JSON (Snake Case): {"first_name":"John","last_name":"Doe"}
Deserialized User: User{firstName='John', lastName='Doe'}
2. Kebab Case Naming Strategy
উদাহরণ: Kebab Case ব্যবহার
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.PropertyNamingStrategies;
public class KebabCaseExample {
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
// Kebab Case Naming Strategy সেট করা
mapper.setPropertyNamingStrategy(PropertyNamingStrategies.KEBAB_CASE);
User user = new User("Jane", "Doe");
String json = mapper.writeValueAsString(user);
System.out.println("Serialized JSON (Kebab Case): " + json);
String inputJson = "{ \"first-name\": \"Jane\", \"last-name\": \"Doe\" }";
User deserializedUser = mapper.readValue(inputJson, User.class);
System.out.println("Deserialized User: " + deserializedUser);
}
}
Output:
Serialized JSON (Kebab Case): {"first-name":"Jane","last-name":"Doe"}
Deserialized User: User{firstName='Jane', lastName='Doe'}
3. Camel Case Naming Strategy
Camel Case ডিফল্ট স্টাইল:
- Jackson ডিফল্টভাবে camelCase ব্যবহার করে। কোনো অতিরিক্ত কনফিগারেশন প্রয়োজন নেই।
4. Custom Naming Strategy
Custom Naming Strategy তৈরি:
আপনার নিজের কাস্টম নামকরণ স্ট্র্যাটেজি তৈরি করতে PropertyNamingStrategy এক্সটেন্ড করুন।
import com.fasterxml.jackson.databind.PropertyNamingStrategies;
public class CustomNamingStrategy extends PropertyNamingStrategies.NamingBase {
@Override
public String translate(String propertyName) {
return "custom_" + propertyName.toLowerCase();
}
}
Custom Naming Strategy ব্যবহার:
import com.fasterxml.jackson.databind.ObjectMapper;
public class CustomNamingStrategyExample {
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
// Custom Naming Strategy সেট করা
mapper.setPropertyNamingStrategy(new CustomNamingStrategy());
User user = new User("Custom", "Strategy");
String json = mapper.writeValueAsString(user);
System.out.println("Serialized JSON (Custom): " + json);
}
}
Output:
Serialized JSON (Custom): {"custom_firstname":"Custom","custom_lastname":"Strategy"}
Jackson Naming Strategy এর তুলনা
| Naming Style | Description | Example |
|---|---|---|
| Camel Case | ডিফল্ট স্টাইল | firstName |
| Snake Case | underscore (_) দিয়ে পৃথক | first_name |
| Kebab Case | হাইফেন (-) দিয়ে পৃথক | first-name |
| Custom | প্রয়োজন অনুযায়ী সংজ্ঞায়িত | custom_firstname |
নামকরণ স্ট্র্যাটেজি সেট করার সুবিধা
- Consistency: JSON ডেটার ফরম্যাট স্ট্যান্ডার্ড রাখতে সাহায্য করে।
- Interoperability: বিভিন্ন সিস্টেম বা API-এর সাথে সমন্বয় সহজ হয়।
- Customization: বিশেষ প্রয়োজন অনুযায়ী JSON ফরম্যাট তৈরি করা যায়।
Jackson এর Snake Case, Kebab Case, এবং Camel Case কনফিগারেশন সহজ এবং কার্যকর। এছাড়াও, কাস্টম নামকরণ স্ট্র্যাটেজি ব্যবহার করে প্রয়োজন অনুযায়ী JSON ফরম্যাটিং কাস্টমাইজ করা যায়।
Jackson ব্যবহার করে JSON ফিল্ডের নাম এবং জাভার ফিল্ডের নামের মধ্যে মেপিং করতে কাস্টম নামকরণের কনভেনশন প্রয়োগ করা যায়।
1. Custom Naming Strategy
Jackson PropertyNamingStrategy এবং JacksonAnnotationIntrospector ব্যবহার করে JSON ফিল্ডের নাম কাস্টমাইজ করতে সহায়তা করে।
উদাহরণ: Snake Case কনভেনশন
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.PropertyNamingStrategies;
class User {
private String firstName;
private String lastName;
// Constructors, Getters, and Setters
public User(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
}
public class CustomNamingStrategyExample {
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
// Snake Case Naming Strategy
mapper.setPropertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE);
User user = new User("John", "Doe");
// Serialize
String json = mapper.writeValueAsString(user);
System.out.println("Serialized JSON: " + json);
// Deserialize
String userJson = "{\"first_name\":\"John\",\"last_name\":\"Doe\"}";
User deserializedUser = mapper.readValue(userJson, User.class);
System.out.println("Deserialized User: " + deserializedUser.getFirstName() + " " + deserializedUser.getLastName());
}
}
আউটপুট:
Serialized JSON: {"first_name":"John","last_name":"Doe"}
Deserialized User: John Doe
2. @JsonProperty দিয়ে Custom Name নির্ধারণ করা
@JsonProperty ব্যবহার করে নির্দিষ্ট ফিল্ডের নাম কাস্টমাইজ করা যায়।
উদাহরণ: @JsonProperty ব্যবহার
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.ObjectMapper;
class Employee {
@JsonProperty("employee_id")
private int id;
@JsonProperty("employee_name")
private String name;
// Constructors, Getters, and Setters
public Employee(int id, String name) {
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class JsonPropertyExample {
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
Employee employee = new Employee(1, "Alice");
// Serialize
String json = mapper.writeValueAsString(employee);
System.out.println("Serialized JSON: " + json);
// Deserialize
String employeeJson = "{\"employee_id\":1,\"employee_name\":\"Alice\"}";
Employee deserializedEmployee = mapper.readValue(employeeJson, Employee.class);
System.out.println("Deserialized Employee: " + deserializedEmployee.getName());
}
}
আউটপুট:
Serialized JSON: {"employee_id":1,"employee_name":"Alice"}
Deserialized Employee: Alice
3. Custom Naming Strategy ক্লাস তৈরি করা
Jackson-এ কাস্টম নামকরণ লজিক প্রয়োগ করতে একটি কাস্টম PropertyNamingStrategy তৈরি করা যায়।
উদাহরণ: Custom Naming Strategy
import com.fasterxml.jackson.databind.PropertyNamingStrategies;
import com.fasterxml.jackson.databind.ObjectMapper;
class CustomNamingStrategy extends PropertyNamingStrategies.PropertyNamingStrategyBase {
@Override
public String translate(String propertyName) {
// Custom naming logic: Prefix 'my_' to all properties
return "my_" + propertyName;
}
}
class Product {
private String name;
private double price;
// Constructors, Getters, and Setters
public Product(String name, double price) {
this.name = name;
this.price = price;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
}
public class CustomNamingStrategyExample {
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
// Custom Naming Strategy
mapper.setPropertyNamingStrategy(new CustomNamingStrategy());
Product product = new Product("Laptop", 1500.0);
// Serialize
String json = mapper.writeValueAsString(product);
System.out.println("Serialized JSON: " + json);
// Deserialize
String productJson = "{\"my_name\":\"Laptop\",\"my_price\":1500.0}";
Product deserializedProduct = mapper.readValue(productJson, Product.class);
System.out.println("Deserialized Product: " + deserializedProduct.getName() + " - $" + deserializedProduct.getPrice());
}
}
আউটপুট:
Serialized JSON: {"my_name":"Laptop","my_price":1500.0}
Deserialized Product: Laptop - $1500.0
4. Default Naming Strategies
Jackson ইতোমধ্যে বেশ কিছু ডিফল্ট Naming Strategies প্রদান করে:
SNAKE_CASE:firstName→first_nameUPPER_CAMEL_CASE:firstName→FirstNameLOWER_CAMEL_CASE:firstName→firstName(ডিফল্ট)KEBAB_CASE:firstName→first-name
Naming Strategy সেট করা
mapper.setPropertyNamingStrategy(PropertyNamingStrategies.KEBAB_CASE);
5. টিপস
- Custom Logic প্রয়োজন হলে: কাস্টম
PropertyNamingStrategyব্যবহার করুন। - Annotation প্রাধান্য:
@JsonPropertyব্যবহার করলে সেটি কাস্টম Naming Strategy এর উপর প্রাধান্য পায়। - Global Naming Strategy: পুরো অ্যাপ্লিকেশনে একধরনের নামকরণ প্রয়োগ করতে
ObjectMapper-এ Naming Strategy সেট করুন।
6. Use Cases
- API Integration: ভিন্ন কনভেনশনের API-এর সাথে কাজ করার জন্য।
- Legacy Systems: পুরানো ডেটা ফরম্যাট বা কনভেনশন বজায় রাখতে।
- Custom Requirements: স্পেসিফিক ডেটা ফরম্যাট কাস্টমাইজ করতে।
Jackson এর Naming Strategies এবং কাস্টম লজিক JSON ফিল্ড এবং জাভা প্রোপার্টির মধ্যে কাস্টমাইজড ম্যাপিং করতে কার্যকর। ছোট ফিল্ড কনফিগারেশনের জন্য @JsonProperty এবং বড় বা গ্লোবাল প্রয়োজনে Naming Strategy ব্যবহার করা উপযুক্ত।
Read more